#define Swap(x, y) { ElemSet t = x; x = y; y = t; }
void Partition(ElemSet *a, int n) {
    int i, j;
    ElemSet p;

    i = 0;
    j = n - 1;
    p = 0; /* 选择0作为轴点 */
    while (1) {
        while (i < n
                && a[i] < p) { /* 找到i以右第一个大于等于轴点的元素 */
            i++;
        }
        while (j > 0 && a[j] >= p) {/*找到j以前第一个小于轴点的元素 */
            j--;
        }
        if (i >= j) { /* 如果i大于等于j，完成拆分，退出循环 */
            break;
        }
        Swap(a[i], a[j]); /* 交换a[i]和a[j]并右移i左移j */
        i++;
        j--;
    }
}